65536メソッドを超えたときの対処方法
Androidアプリでメソッド数が65536を超えるとビルド時にエラーになります。
65536メソッド以上になってしまった場合の対処方法を紹介します。
結構泥臭いところなので、迷わないようにまとめておきます。
ライブラリーの選定/不必要なライブラリーを削除する
根本的部分から見直してみましょう。多いなら少なくすればいいのです。 まずは、どのライブラリかどのくらいのメソッドが定義してあるか測定しましょう。 Android Studio 2.2でApkのメソッド数をかぞえる | Developers.IO
そして、同じような機能のライブラリを2つ、3つ入れてたりしていないか、 ライブラリを必要な機能部分だけ読み込むことはできないか見直しましょう。
たとえば、Google Play Servicesを利用している場合、以下のように読み込んでいないでしょうか?
compile 'com.google.android.gms:play-services:9.6.1'
Setting Up Google Play Services | Google APIs for Android | Google Developersより
Google Play Servicesは、かなり多くの機能提供しており、大抵の場合、その中の一部の機能しかプロジェクトで使っていないはずです。 自分が必要なものだけを読み込むようにしましょう。
compile 'com.google.android.gms:play-services-analytics:9.6.1' compile 'com.google.android.gms:play-services-ads:9.6.1'
重複して読み込んでいるライブラリを1つにする
ライブラリを複数読み込んでいる場合、ライブラリ同士で同じライブラリに依存しているケースがあり、その場合複数のバージョンが入ってしまう場合あります。 その場合は、バージョンを固定していたり、ライブラリの依存しているライブラリを読み込まないようにしてあげます。
たとえば、Support Library V4は、比較的色々なライブラリで依存しており、それぞれのライブラリでバージョンが違っていたりします。 その場合はライブラリの方をexcludeして読み込まないようにしてあげます。
compile ('com.aviary.android.feather.sdk:aviary-sdk:3.4.3.351') { exclude module: 'support-v4' }
(Androidでメソッド数が65536を超えた時の対処方法 - Qiitaより引用)
ProGuardを適応する
ProGuardを使用することで、難読化、使用していないメソッドを削除することできます。 ビルドは遅くなりますが、メソッドを結構削減できるようになります。 適応の仕方は、Android Proguard再再入門 – ① – | Developers.IOを参考に。 ProGuardはrelease時にはかけるがdebug時にかけない人が多いと思います。 その理由は難読化のせいで開発の時にエラーなどのメッセージが読みにくくなってしまうためです。 なんとそんな方に朗報があります。 メソッドはProGuardに則り削除はするが、リネームなどは行わないという設定ができます。
buildTypes { debug { debuggable true minifyEnabled true // メソッドは削除するがリネームなどはしない useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
利点としては、デバック時にもProGuardの設定に則り削除されるので、releaseのときにProGuardのせいで動かなくすることを防げます。 なるべくreleaseと近い環境で開発しつつ、エラーメッセージで a.b などにならずに開発できます。
奥の手Multidex
Multidexを使用することで、65536メソッドを制限を解除することができます。 奥の手としては制限を外せますが、上のチューニングをしてもダメな時にお使いください。
Configure Apps with Over 64K Methods | Android Studio
まとめ
65536メソッド問題は、泥臭く誰もやりたがらないAndroidのツラミです。 すぐにMultidexをするのではなく、やれることはやったほうが幸せになります。 Multidexを使用しないその他のチューニング方法がある場合、 ぜひともご教授のほどよろしくお願いします!